/*
 * Copyright (c) 2022  by Junzhao
 * THIS FILE IS PART OF JAVASE Song Huongkang PROJECT
 * All Rights Reserved.
 */

package 学习.下.抽象类和abstract关键字;
/**
 * @description abstract 关键字
 *          abstract 抽象的
 *          修饰类 方法
 *          不能实例对象 但一定有构造器 便于子类实例化 提供抽象类的子类让子类实例化
 *          抽象方法 只有方法声明没有方法体 子类必须重写
 *
 *          抽象方法一定在抽象类 子类如想实例化必须重写所有的父类的抽象方法
 *
 *          会有冲突 不修饰private方法 不修饰final方法
 * @author 俊昭
 * @date 2022/4/6
*/

public class AbstractTest {
    public static void main(String[] args) {
//        Person p1 =new Person();'Person' 为 abstract；无法实例化
        Student student = new Student();
        Student student1 = new Student();

        // 抽象类的 匿名对象 是创建了一个子类的对象以多态赋给父类
        Person person=new Person() {
            @Override
            public void eat() {
                System.out.println("吃");
            }

            @Override
            public void sleep() {

            }
        };
        person.eat();// 执行的是重写的方法
        student.sleep();


    }
}
abstract class Animal{
    public abstract void sleep();
}
abstract class Person extends Animal {// 不可以实例化
    String name;
    int age;

// 父类构造器不能用了 但是子类可以用 要事先声明
    public Person() {
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public abstract void eat();
//    public abstract void sleep();

}



class Student extends Person{// 类 "Student" 必须声明为抽象，或为实现 "Person" 中的抽象方法 "eat()"子类的

    public Student(){
        super();
    }
    public Student(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println("学生吃饭");
    }

    @Override
    public void sleep() {
        System.out.println("睡足八小时");
    }
}